package com.cw.lang.redis.service.impl;

import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;

import com.cw.lang.redis.config.RedisProperties;

import lombok.Getter;
import lombok.Setter;

/**
 * @author chenw
 * @version $$Id: AbstractRedisService.java, v 0.1 2018/12/25 9:52 AM chenw Exp $$
 */
@Getter
@Setter
public abstract class AbstractRedisService<K, V> {
    private RedisTemplate<K, V> redisTemplate;

    private RedisOperations<String, V> stringKeyRedisTemplate;

    private RedisProperties redisProperties;

    /**
     * 根据key获取template
     *
     * @param k key
     * @return template
     */
    RedisTemplate<K, V> getRedisTemplate(K k) {
        if (getRedisProperties().isStringKeyTemplateEnabled() && k != null && k.getClass()
            .isAssignableFrom(String.class)) {
            return (RedisTemplate<K, V>) stringKeyRedisTemplate;
        } else {
            return redisTemplate;
        }
    }

    /**
     * 根据class类型获取template
     *
     * @param clazz class类型
     * @return template
     */
    RedisTemplate<K, V> getRedisTemplate(Class<?> clazz) {
        if (getRedisProperties().isStringKeyTemplateEnabled() && clazz != null && clazz.isAssignableFrom(
            String.class)) {
            return (RedisTemplate<K, V>) stringKeyRedisTemplate;
        } else {
            return redisTemplate;
        }
    }

    /**
     * 获取默认template
     *
     * @return template
     */
    RedisTemplate<K, V> getRedisTemplate() {
        return redisTemplate;
    }
}
